home *** CD-ROM | disk | FTP | other *** search
- Path: news.larc.nasa.gov!amiga-request
- From: amiga-request@ab20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
- Subject: v91i097: MandelbrotSet 1.2 - generate and save mandelbrot and julia sets, Part01/01
- Reply-To: RWALLACE%vax1.tcd.ie@pucc.PRINCETON.EDU
- Newsgroups: comp.sources.amiga
- Message-ID: <comp.sources.amiga:v91i097@ab20.larc.nasa.gov>
- Date: 08 May 91 00:15:40 GMT
- Approved: tadguy@uunet.UU.NET (Tad Guy)
- X-Mail-Submissions-To: amiga@uunet.uu.net
- X-Post-Discussions-To: comp.sys.amiga.misc
-
- Submitted-by: RWALLACE%vax1.tcd.ie@pucc.PRINCETON.EDU
- Posting-number: Volume 91, Issue 097
- Archive-name: applications/mandset-1.2/part01
-
- [ includes uuencoded executable and icons ...tad ]
-
- The program in this drawer will display the Mandelbrot and Julia
- sets and save them to disk as IFF files. Each image takes several hours
- to generate, though programs which allow multitasking can be used while
- this is going on.
-
- #!/bin/sh
- # This is a shell archive. Remove anything before this line, then unpack
- # it by saving it into a file and typing "sh file". To overwrite existing
- # files, type "sh file -c". You can also feed this as standard input via
- # unshar, or by typing "sh <file", e.g.. If this archive is complete, you
- # will see the following message at the end:
- # "End of archive 1 (of 1)."
- # Contents: Mandelbrot_Set.c Mandelbrot_Set.doc console.c input.c
- # makefile mandelbrot0.uu mandelbrot1.uu mandelbrot_.uu saveilbm.c
- # scanfloat.c
- # Wrapped by tadguy@ab20 on Tue May 7 20:15:39 1991
- PATH=/bin:/usr/bin:/usr/ucb ; export PATH
- if test -f 'Mandelbrot_Set.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'Mandelbrot_Set.c'\"
- else
- echo shar: Extracting \"'Mandelbrot_Set.c'\" \(8069 characters\)
- sed "s/^X//" >'Mandelbrot_Set.c' <<'END_OF_FILE'
- X/* Mandelbrot and Julia set program by Russell Wallace 1987. Requires linkage
- X with files saveilbm.o input.o console.o. If using Aztec C,
- X also link with m.lib and use +L compile option.
- X
- X Original version developed with Aztec C 3.2a. Version 1.1 recompiled with
- X Lattice C 4.0 1 October 1988, not because I think Lattice C is better than
- X Aztec overall but because I can get Lattice to do double-precision floating
- X point (though not using the standard Amiga libraries) whereas the Aztec
- X version only used single precision which severely restricted the detail
- X which could be plotted. Use the enclosed makefile with Aztec C's make
- X utility to compile under Lattice (if you have both compilers...)
- X
- X Version 1.2 24 October 1988 with Lattice C 4.0, uses NTSC/PAL vertical
- X resolution depending on the system it's running on. Also correctly displays
- X the region far from the Mandelbrot set as color 0. */
- X
- X#include <exec/exec.h>
- X#include <exec/execbase.h>
- X#include <hardware/blit.h>
- X#include <graphics/copper.h>
- X#include <graphics/regions.h>
- X#include <graphics/gfxbase.h>
- X#include <graphics/gfxmacros.h>
- X#include <graphics/gels.h>
- X#include <intuition/intuition.h>
- X
- Xstruct IntuitionBase *IntuitionBase=NULL;
- Xstruct GfxBase *GfxBase=NULL;
- X
- X#define MAXX 320
- Xint maxy;
- X#define NUMITEMS 5 /* 5 items in menu */
- X#define BUFLEN 50 /* Length of input buffer */
- X
- Xshort input ();
- Xlong saveilbm (),start ();
- X
- Xchar inbuf[BUFLEN];
- X
- Xstruct NewScreen MyScreen=
- X{
- X 0,0,
- X MAXX,0,
- X 5,0,31,
- X 0,
- X CUSTOMSCREEN,
- X 0,
- X "Mandelbrot Set v1.2",
- X 0,0
- X};
- X
- Xstruct NewWindow DrawWindow=
- X{
- X 0,0,
- X MAXX,0,
- X 0,31,
- X MENUPICK,
- X BORDERLESS|BACKDROP|ACTIVATE,
- X 0,
- X 0,
- X 0,
- X 0,
- X 0,
- X 0,
- X 0,
- X 0,
- X 0,
- X CUSTOMSCREEN
- X};
- X
- Xstruct Screen *Screen=NULL;
- Xstruct Window *Backdrop=NULL;
- Xstruct RastPort *DrawRP;
- Xstruct ViewPort *DrawVP;
- Xstruct IntuiMessage *message;
- X
- Xstruct MenuItem MenuItems[NUMITEMS];
- Xstruct IntuiText MenuText[NUMITEMS];
- Xstruct Menu Menu[1];
- X
- XBYTE titlebar=TRUE;
- XUSHORT palette[]={0x000,0xF00,0xF20,0xF40,
- X 0xF60,0xF80,0xFA0,0xFC0,
- X 0xFE0,0xFF0,0xEF0,0xCF0,
- X 0xAF0,0x8F0,0x6F0,0x4F0,
- X 0x2F0,0x0F0,0x0E2,0x0C4,
- X 0x0A6,0x088,0x06A,0x04C,
- X 0x02E,0x00F,0x10F,0x40F,
- X 0x80F,0xB0F,0xF0F,0xAAA}; /* Color palette in hex */
- X
- Xmain ()
- X{
- X ULONG class;
- X USHORT code,ItemNum;
- X IntuitionBase=(struct IntuitionBase *)OpenLibrary ("intuition.library",0);
- X /* Come on, when is intuition.library not going to be available? */
- X GfxBase=(struct GfxBase *)OpenLibrary ("graphics.library",0);
- X /* Ditto graphics.library */
- X MyScreen.Height=DrawWindow.Height=maxy=GfxBase->NormalDisplayRows;
- X /* Fetch PAL/NTSC screen height values */
- X if (!(Screen=(struct Screen *)OpenScreen (&MyScreen)))
- X {
- X cleanup ();
- X exit (3);
- X }
- X DrawWindow.Screen=Screen;
- X if (!(Backdrop=(struct Window *)OpenWindow (&DrawWindow)))
- X {
- X cleanup ();
- X exit (4);
- X }
- X DrawRP=Backdrop->RPort;
- X DrawVP=&Screen->ViewPort;
- X setcols ();
- X initmenuitems ();
- X initmenu ();
- X SetMenuStrip (Backdrop,&Menu[0]);
- X SetRast (DrawRP,0);
- X
- X FOREVER
- X {
- X WaitPort (Backdrop->UserPort);
- X while (message=(struct IntuiMessage *)GetMsg (Backdrop->UserPort))
- X {
- X class=message->Class;
- X code=message->Code;
- X ReplyMsg (message);
- X if (class==MENUPICK && code!=MENUNULL)
- X {
- X ItemNum=ITEMNUM (code);
- X switch (ItemNum)
- X {
- X case 0: /* Show/hide title bar */
- X ClearMenuStrip (Backdrop);
- X if (titlebar==TRUE)
- X {
- X titlebar=FALSE;
- X ShowTitle (Screen,0);
- X MenuText[0].IText=(UBYTE *)"Show Title Bar";
- X }
- X else
- X {
- X titlebar=TRUE;
- X ShowTitle (Screen,1);
- X MenuText[0].IText=(UBYTE *)"Hide Title Bar";
- X }
- X SetMenuStrip (Backdrop,Menu);
- X break;
- X case 1: /* Do Mandelbrot Set */
- X doset (0);
- X break;
- X case 2: /* Do Julia Set */
- X doset (1);
- X break;
- X case 3: /* Save screen */
- X if (titlebar)
- X ShowTitle (Screen,0);
- X savescreen ();
- X if (titlebar)
- X ShowTitle (Screen,1);
- X break;
- X case 4: /* Exit */
- X ClearMenuStrip (Backdrop);
- X cleanup ();
- X exit (0);
- X }
- X }
- X }
- X }
- X}
- X
- Xsavescreen ()
- X{
- X if (!(start (Screen,"Save screen")))
- X {
- X DisplayBeep (Screen);
- X return;
- X }
- X print ("Enter filename:\n");
- X inbuf[0]='\0';
- X if (input (inbuf,BUFLEN)==-1000)
- X {
- X finish ();
- X return;
- X }
- X finish ();
- X if (saveilbm (DrawRP->BitMap,palette,inbuf))
- X DisplayBeep (Screen);
- X}
- X
- Xdoset (type)
- Xint type;
- X{
- X register short n,i,j;
- X double x,y,xx,a,b,xgap,ygap,xsquared,ysquared;
- X double x1,y1,x2,y2,cx,cy,scanfloat ();
- X if (!(start (Screen,"Enter Parameters")))
- X {
- X DisplayBeep (Screen);
- X return;
- X }
- X if (type)
- X {
- X print ("Enter X component of C:\n");
- X inbuf[0]='\0';
- X if (input (inbuf,BUFLEN)==-1000)
- X {
- X finish ();
- X return;
- X }
- X cx=scanfloat (inbuf);
- X print ("Enter Y component of C:\n");
- X inbuf[0]='\0';
- X if (input (inbuf,BUFLEN)==-1000)
- X {
- X finish ();
- X return;
- X }
- X cy=scanfloat (inbuf);
- X }
- XENTERAGAIN:
- X print ("Enter bottom left X co-ord:\n");
- X inbuf[0]='\0';
- X if (input (inbuf,BUFLEN)==-1000)
- X {
- X finish ();
- X return;
- X }
- X x1=scanfloat (inbuf);
- X print ("Enter bottom left Y co-ord:\n");
- X inbuf[0]='\0';
- X if (input (inbuf,BUFLEN)==-1000)
- X {
- X finish ();
- X return;
- X }
- X y1=scanfloat (inbuf);
- X print ("Enter top right X co-ord:\n");
- X inbuf[0]='\0';
- X if (input (inbuf,BUFLEN)==-1000)
- X {
- X finish ();
- X return;
- X }
- X x2=scanfloat (inbuf);
- X print ("Enter top right Y co-ord:\n");
- X inbuf[0]='\0';
- X if (input (inbuf,BUFLEN)==-1000)
- X {
- X finish ();
- X return;
- X }
- X y2=scanfloat (inbuf);
- X if (y2<=y1 || x2<=x1)
- X {
- X print ("Invalid co-ordinates!\n");
- X goto ENTERAGAIN;
- X }
- X finish ();
- X SetRast (DrawRP,0);
- X xgap=(x2-x1)/MAXX;
- X ygap=(y2-y1)/maxy;
- X b=y1; /* Y co-ord */
- X for (j=maxy-1;j>=0;j--) /* Run up screen */
- X {
- X a=x1;
- X for (i=0;i<MAXX;i++) /* Run across row on screen */
- X {
- X n=0;
- X x=a; /* x,y contain temporary co-ords of current point */
- X y=b; /* which will be used in calculations */
- X xsquared=x*x;
- X ysquared=y*y;
- X /* calculate squares for initial check in loop */
- X if (type==0) /* Mandelbrot set */
- X while (n<511 && xsquared+ysquared<4)
- X {
- X xsquared=x*x;
- X ysquared=y*y;
- X xx=xsquared-ysquared+a;
- X y*=x;
- X y+=y;
- X y+=b;
- X x=xx;
- X n++;
- X }
- X else /* Julia set */
- X while (n<511 && xsquared+ysquared<4)
- X {
- X xsquared=x*x;
- X ysquared=y*y;
- X xx=xsquared-ysquared+cx;
- X y=2*x*y+cy;
- X x=xx;
- X n++;
- X }
- X SetAPen (DrawRP,(long)(n&31)); /* Color point depending on n */
- X WritePixel (DrawRP,(long)i,(long)j);
- X a+=xgap; /* Increment logical X co-ord */
- X }
- X b+=ygap; /* Increment logical Y co-ord */
- X }
- X}
- X
- Xsetcols ()
- X{
- X short i;
- X for (i=0;i<32;i++)
- X SetRGB4 (DrawVP,(long)i,(long)((palette[i] & 0xF00)>>8),(long)((palette[i] & 0xF0)>>4),(long)(palette[i] & 0xF));
- X}
- X
- Xinitmenuitems ()
- X{
- X register short n;
- X for (n=0;n<NUMITEMS;n++)
- X {
- X MenuItems[n].LeftEdge=0;
- X MenuItems[n].TopEdge=10*n;
- X MenuItems[n].Width=144; /* 8 times no. of chars */
- X MenuItems[n].Height=10;
- X MenuItems[n].Flags=ITEMTEXT|ITEMENABLED|HIGHCOMP;
- X MenuItems[n].MutualExclude=0;
- X MenuItems[n].ItemFill=(APTR)&MenuText[n];
- X MenuItems[n].SelectFill=NULL;
- X MenuItems[n].Command=0;
- X MenuItems[n].SubItem=NULL;
- X MenuItems[n].NextSelect=0;
- X MenuItems[n].NextItem=&MenuItems[n+1];
- X MenuText[n].FrontPen=0;
- X MenuText[n].BackPen=31;
- X MenuText[n].DrawMode=JAM2;
- X MenuText[n].LeftEdge=0;
- X MenuText[n].TopEdge=1;
- X MenuText[n].ITextFont=0;
- X MenuText[n].NextText=0;
- X }
- X MenuItems[NUMITEMS-1].NextItem=NULL;
- X MenuText[0].IText=(UBYTE *)"Hide Title Bar";
- X MenuText[1].IText=(UBYTE *)"Do Mandelbrot Set";
- X MenuText[2].IText=(UBYTE *)"Do Julia Set";
- X MenuText[3].IText=(UBYTE *)"Save Screen";
- X MenuText[4].IText=(UBYTE *)"Exit";
- X}
- X
- Xinitmenu ()
- X{
- X Menu[0].NextMenu=0;
- X Menu[0].LeftEdge=0;
- X Menu[0].TopEdge=0;
- X Menu[0].Width=85;
- X Menu[0].Height=10;
- X Menu[0].Flags=MENUENABLED;
- X Menu[0].MenuName="Options";
- X Menu[0].FirstItem=&MenuItems[0];
- X}
- X
- Xcleanup ()
- X{
- X if (Backdrop)
- X CloseWindow (Backdrop);
- X if (Screen)
- X CloseScreen (Screen);
- X CloseLibrary (GfxBase);
- X CloseLibrary (IntuitionBase);
- X}
- END_OF_FILE
- if test 8069 -ne `wc -c <'Mandelbrot_Set.c'`; then
- echo shar: \"'Mandelbrot_Set.c'\" unpacked with wrong size!
- fi
- # end of 'Mandelbrot_Set.c'
- fi
- if test -f 'Mandelbrot_Set.doc' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'Mandelbrot_Set.doc'\"
- else
- echo shar: Extracting \"'Mandelbrot_Set.doc'\" \(4263 characters\)
- sed "s/^X//" >'Mandelbrot_Set.doc' <<'END_OF_FILE'
- X THE MANDELBROT SET
- X
- XA complex number is of the form a+bi, where i represents the square root
- Xof minus one. Two complex numbers are added by simply adding their
- Xcomponents. Two complex numbers are multiplied as follows:
- X
- X (a+bi)(c+di) = ac + cbi + adi - db
- X
- Xremembering that i squared = -1. Complex numbers can be thought of as
- Xpoints on a plane, with a representing the X co-ordinate and b the Y
- Xco-ordinate. Now take the operation:
- X
- X z = z*z + c
- X
- Xwhere z and c are complex numbers. If z is initially set to 0 and c is a
- Xpoint on the plane, iterating (repeating) this operation many times will
- Xcause the point represented by z to wander in an irregular pattern. Some
- Xinitial values of c will cause z to increase without limit, while other
- Xvalues will cause it to always stay within a certain range. In fact, if
- Xthe distance of z from the origin (i.e. sqrt (a*a + b*b)) ever exceeds 2,
- Xz is destined to wander to infinity. The Mandelbrot set is the set of all
- Xpoints
- Xwhich will always stay within a finite range, no matter how many times
- Xthe operation is applied.
- X Suppose that for every point within a rectangular area of the plane,
- Xwe use the point as an initial value for c and do z=z*z+c until either
- Xwe've done it 1000 times or the distance of z from the origin exceeds 2.
- XThe points for which we only had to do it a few times are far away from
- Xthe Mandelbrot set. Those which required a lot of iterations are close to
- Xit, and the ones which were still within 2 after 1000 calculations are,
- Xas far as we can tell, within it. (There will be a few points which would
- Xhave exceeded 2 after more than 1000 iterations; 1000 is a reasonable
- Xcompromise between processing time and accuracy.) If we now plot the
- Xpoints on a computer screen using different colors to represent varying
- Xdistances from the Mandelbrot set, a striking and colorful display can be
- Xcreated.
- X The Mandelbrot set is of finite size, and if a large region of the
- Xplane is plotted it looks like a small blob of color floating in a vast
- Xuniform sea. Co-ordinate ranges of X from -2 to .5 and Y from -1.25 to
- X1.25 more or less display the full set, you can input a narrower range of
- Xvalues to zoom in on a region near the edge of the set, then zoom in on a
- Xsmall part of this region, etc. The boundary of the set is a fractal - it
- Xshows similar but not identical detail at every scale, and is infinitely
- Xconvoluted. The limit of magnification is determined by the precision to
- Xwhich the calculations are done. The Amiga stores double precision
- Xnumbers to about 16 digits. This means that, if the Mandelbrot set were
- Xthe size of Western Europe, the smallest distinguishable elements of it
- Xwould be the size of atoms.
- X For the Mandelbrot set, we used the array of points to provide
- Xstarting values for c and always set z to 0. If we use different fixed
- Xstarting values of z, the result is simply a distorted version of the set
- X- as a writer in Scientific American magazine put it, "one prefers the
- Xcanonical object". What happens if we use a fixed value of c and obtain
- Xthe starting value of z from the array of points? In this case a Julia
- Xset is displayed - a different one for each value of c. Julia sets, like
- Xthe Mandelbrot set, are fractals, and their overall shape is related to
- Xthe position of c in the Mandelbrot set.
- X The program in this drawer will display the Mandelbrot and Julia
- Xsets and save them to disk as IFF files. Each image takes several hours
- Xto generate, though programs which allow multitasking can be used while
- Xthis is going on. When asked to enter the co-ordinate ranges, note that
- Xincreasing Y values are plotteed up the screen not down, and that the
- Xbottom left co-ordinates must be less than the top-right corner ones. Now
- Xfor the legal and financial stuff. This is a shareware program. You may
- Xfreely copy it, put it on bulletin boards etc. If you have not already
- Xpaid for this copy and wish to use it, please send a small
- Xcontribution to: Russell Wallace, 24 Lower Georges St, Dunlaoghaire, Co.
- XDublin, Ireland. Further programs and example images can be obtained by
- Xsending a blank disk (or better still, a disk with some interesting stuff
- Xon it) to the same source.
- END_OF_FILE
- if test 4263 -ne `wc -c <'Mandelbrot_Set.doc'`; then
- echo shar: \"'Mandelbrot_Set.doc'\" unpacked with wrong size!
- fi
- # end of 'Mandelbrot_Set.doc'
- fi
- if test -f 'console.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'console.c'\"
- else
- echo shar: Extracting \"'console.c'\" \(6098 characters\)
- sed "s/^X//" >'console.c' <<'END_OF_FILE'
- X
- X/* Console routines by Russell Wallace 1987, some obtained from other programs
- X * books etc. Feel free to copy them or use them in your own programs. Use
- X * +L option if compiling with Aztec C. */
- X
- X#include "exec/exec.h"
- X#include "devices/console.h"
- X#include "devices/keymap.h"
- X#include "libraries/dos.h"
- X#include "intuition/intuition.h"
- X
- X#define INTUITION_MESSAGE (1<<intuitionMsgBit)
- X#define TYPED_CHARACTER (1<<consoleReadBit)
- X#define CloseConsole(x) CloseDevice(x)
- X#define XOFFSET 26
- X#define YOFFSET 39
- X
- Xextern struct Window *OpenWindow ();
- Xextern struct MsgPort *CreatePort ();
- Xextern struct IOStdReq *CreateStdIO ();
- X
- Xshort line,column;
- Xint class,code;
- Xstruct NewWindow mynewwindow=
- X{
- X 20,20, /* x,y co-ords of top left corner */
- X 280,100, /* start size */
- X 0,31, /* detailpen,blockpen */
- X MENUPICK|CLOSEWINDOW, /* want to know if these happen */
- X ACTIVATE|GIMMEZEROZERO|WINDOWDRAG|WINDOWCLOSE,
- X 0,0,0,0,0,
- X 120,88, /* minimum size */
- X 640,256, /* maximum size */
- X CUSTOMSCREEN
- X};
- Xstruct IOStdReq *consoleWriteMsg=0;
- Xstruct IOStdReq *consoleReadMsg=0;
- Xstruct MsgPort *consoleWritePort=0;
- Xstruct MsgPort *consoleReadPort=0;
- Xunsigned char letter;
- Xstruct Window *mywindow=0;
- Xstruct IntuiMessage *con_message;
- X
- X /* Start() must be called at beginning; returns window pointer - if 0,
- X * program has failed ... everything already cleaned up here, main ()
- X * must do its own cleaning up then exit */
- X
- Xstruct Window *start (screen,title)
- Xstruct Screen *screen;
- Xchar *title;
- X{
- X int consoleReadBit,intuitionMsgBit;
- X line=column=0;
- X mynewwindow.Title=title;
- X mynewwindow.Screen=screen;
- X if (!(mywindow=OpenWindow (&mynewwindow)))
- X goto FAILED;
- X if (!(consoleWritePort=CreatePort ("my.con.write",0)))
- X goto FAILED;
- X if (!(consoleReadPort=CreatePort ("my.con.read",0)))
- X goto FAILED;
- X if (!(consoleWriteMsg=CreateStdIO (consoleWritePort)))
- X goto FAILED;
- X if (!(consoleReadMsg=CreateStdIO (consoleReadPort)))
- X goto FAILED;
- X if (OpenConsole (consoleWriteMsg,consoleReadMsg,mywindow))
- X goto FAILED;
- X QueueRead (consoleReadMsg,&letter);
- X consoleReadBit=consoleReadPort->mp_SigBit;
- X intuitionMsgBit=mywindow->UserPort->mp_SigBit;
- X SetAPen (mywindow->RPort,2);
- X return (mywindow);
- XFAILED:
- X closeall ();
- X return (0L);
- X}
- X
- X /* Call finish() at the end IF start() was successful */
- X
- Xfinish ()
- X{
- X AbortIO (consoleReadMsg);
- X CloseConsole (consoleWriteMsg);
- X closeall ();
- X}
- X
- Xcloseall ()
- X{
- X if (mywindow)
- X CloseWindow (mywindow);
- X if (consoleWritePort)
- X DeletePort (consoleWritePort);
- X if (consoleReadPort)
- X DeletePort (consoleReadPort);
- X if (consoleWriteMsg)
- X DeleteStdIO (consoleWriteMsg);
- X if (consoleReadMsg)
- X DeleteStdIO (consoleReadMsg);
- X}
- X
- Xint OpenConsole (writerequest,readrequest,window)
- Xstruct IOStdReq *writerequest,*readrequest;
- Xstruct Window *window;
- X{
- X register int error;
- X writerequest->io_Data=(APTR)window;
- X writerequest->io_Length=sizeof(*window);
- X error=OpenDevice ("console.device",0,writerequest,0);
- X readrequest->io_Device=writerequest->io_Device;
- X readrequest->io_Unit =writerequest->io_Unit;
- X return (error);
- X}
- X
- XQueueRead (request,whereto)
- Xstruct IOStdReq *request;
- Xchar *whereto;
- X{
- X request->io_Command=CMD_READ;
- X request->io_Data=(APTR)whereto;
- X request->io_Length=1;
- X SendIO (request);
- X}
- X
- X /* Call checkinput() every so often to find out what the user is doing:
- X * a -ve number -1,-2 ... means the user has selected menu item 1,2 ...
- X * a +ve number means the user has typed a character, 1000 means the
- X * closewindow gadget has been selected, so do your ARE YOU SURE routine
- X * then call finish() and wind up. 0 means nothing's happened. */
- X
- Xshort checkinput ()
- X{
- X if (con_message=(struct IntuiMessage *)GetMsg (mywindow->UserPort))
- X {
- X class=con_message->Class;
- X code=con_message->Code;
- X ReplyMsg (con_message);
- X if (class==CLOSEWINDOW)
- X return ((short)1000);
- X if (class==MENUPICK && code!=MENUNULL)
- X return ((short)(-1-ITEMNUM (code)));
- X }
- X if (GetMsg (consoleReadPort))
- X {
- X code=letter;
- X QueueRead (consoleReadMsg,&letter);
- X return ((short)code);
- X }
- X return ((short)0);
- X}
- X
- X /* Writechar() writes a character to the window ... to get a response from
- X * typed input, call it immediately with any characters returned from
- X * checkinput(). */
- X
- Xwritechar (c) /* NOTE - MUST BE CALLED WITH THE CHARACTER CAST TO TYPE LONG*/
- Xchar c; /* Don't blame me, I don't know why, blame the Amiga */
- X{ /* systems programmers. */
- X consoleWriteMsg->io_Command=CMD_WRITE;
- X consoleWriteMsg->io_Data=(APTR)&c;
- X consoleWriteMsg->io_Length=1;
- X DoIO (consoleWriteMsg);
- X if (c=='\n')
- X {
- X column=0;
- X line++;
- X }
- X if (c!='\n')
- X column++;
- X if ((line<<3)+YOFFSET > mywindow->Height)
- X {
- X print ("MORE...");
- X while (checkinput ()<1 || checkinput ()==1000)
- X ;
- X line=0;
- X print ("\r \r");
- X
- X /* This is to prevent a large quantity of text from scrolling off the top
- X * of the window before the user has time to read it all e.g. in
- X * adventure games. Remove it if you don't need it. Note - don't let the
- X * user make the window too small vertically or an infinite loop occurs.*/
- X
- X }
- X}
- X
- X /* Print() does a formatted (i.e. trying not to split up words on the ends
- X * of lines) print of a null-terminated string; very useful for text-
- X * oriented applications in a variable-sized window. */
- X
- Xprint (string)
- Xchar *string;
- X{
- X short x;
- X for (;;)
- X {
- X x=0;
- X while (string[x]!='\0' && string[x]!=' ' && string[x]!='\n')
- X x++;
- X if (((column+x)<<3)+XOFFSET > mywindow->Width && column)
- X { /* If word would go off end of line, */
- X writechar ((long)'\n'); /* go on to next line before print */
- X }
- X consoleWriteMsg->io_Command=CMD_WRITE;
- X consoleWriteMsg->io_Data=(APTR)string;
- X consoleWriteMsg->io_Length=x;
- X DoIO (consoleWriteMsg);
- X column+=x;
- X if (string[x]=='\n')
- X writechar ((long)'\n');
- X if (string[x]==' ')
- X writechar ((long)' ');
- X if (string[x]=='\0')
- X break;
- X string+=x+1;
- X }
- X}
- X
- Xnprint (string) /* Non-formatted print */
- Xchar *string;
- X{
- X consoleWriteMsg->io_Command=CMD_WRITE;
- X consoleWriteMsg->io_Data=(APTR)string;
- X consoleWriteMsg->io_Length=-1;
- X DoIO (consoleWriteMsg);
- X}
- X
- Xresetscroll () /* Reset scroll pause feature */
- X{
- X line=0;
- X}
- END_OF_FILE
- if test 6098 -ne `wc -c <'console.c'`; then
- echo shar: \"'console.c'\" unpacked with wrong size!
- fi
- # end of 'console.c'
- fi
- if test -f 'input.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'input.c'\"
- else
- echo shar: Extracting \"'input.c'\" \(3067 characters\)
- sed "s/^X//" >'input.c' <<'END_OF_FILE'
- X
- X/* Text input routine by Russell Wallace 1987. Feel free to copy it and use it
- X * in your own programs. Requires linkage to my set of console routines,
- X * console.o. Backspace and cursor keys can be used. DEL key puts
- X * linefeed character in string, RETURN key ends input. Selection of menu
- X * item or closewindow gadget will break off input and return -ve number,
- X * otherwise length of typed-in string returned. Existing text is displayed
- X * for editing; if you don't want that, do a string[0]='\0' before calling. */
- X
- Xshort input (string,length)
- Xunsigned char *string; /* Address of buffer to put text */
- Xlong length; /* Length of buffer */
- X{
- X short c; /* Key pressed */
- X short x; /* Position in buffer */
- X short actlen=0; /* Actual length of typed-in string */
- X register short i;
- X resetscroll ();
- X for (x=0;string[x]!='\0';x++) /* Convert all CRs in existing string to */
- X if (string[x]=='\n') /* editable characters */
- X string[x]=127;
- X nprint (string); /* Non-formatted print on screen for editing */
- X for (;;)
- X {
- X do
- X c=checkinput ();
- X while (!c);
- X if (actlen<x)
- X actlen=x;
- X if (c==1000) /* Close window ... cancel edit */
- X {
- X actlen=-1000;
- X goto ENDINPUT;
- X }
- X if (c<0) /* Menu select ... cancel edit */
- X {
- X actlen=c;
- X goto ENDINPUT;
- X }
- X if (c=='\r') /* Pressed CR ... end edit */
- X goto ENDINPUT;
- X if (c==8 && x) /* Backspace key */
- X {
- X for (i=x-1;i<actlen;i++) /* Delete character in string buffer */
- X string[i]=string[i+1];
- X writechar ((long)8);
- X nprint ((long)(string+(--x))); /* Delete on screen */
- X writechar ((long)' ');
- X for (i=x;i<actlen;i++)
- X writechar ((long)8);
- X actlen--; /* One fewer characters */
- X }
- X if (c==155) /* Code indicating a cursor key etc. */
- X {
- X do
- X c=checkinput (); /* Find out which one */
- X while (!c);
- X if (c==67 && x<actlen) /* Move right */
- X {
- X writechar ((long)155);
- X writechar ((long)67);
- X x++;
- X }
- X if (c==68 && x) /* Move left */
- X {
- X writechar ((long)155);
- X writechar ((long)68);
- X x--;
- X }
- X if (c==65 && x>7) /* Up=back 8 spaces */
- X {
- X x-=8;
- X for (i=0;i<8;i++)
- X {
- X writechar ((long)155);
- X writechar ((long)68);
- X }
- X }
- X if (c==66 && x<actlen-7) /* Down=forward 8 */
- X {
- X x+=8;
- X for (i=0;i<8;i++)
- X {
- X writechar ((long)155);
- X writechar ((long)67);
- X }
- X }
- X c=0;
- X }
- X if (c>31 && c<128 && actlen<length-1)
- X {
- X for (i=actlen;i>x;i--)
- X string[i]=string[i-1];
- X string[++actlen]='\0';
- X string[x++]=c;
- X nprint ((long)(string+x-1));
- X for (i=x;i<actlen;i++)
- X writechar ((long)8);
- X }
- X }
- XENDINPUT:
- X for (i=0;i<x;i++)
- X if (string[i]==127) /* Convert peculiar characters back into */
- X string[i]='\n'; /* CRs for use */
- X string[actlen]='\0'; /* Stick null on end of string */
- X for (i=x;i<actlen;i++)
- X {
- X writechar ((long)155); /* Move cursor to end of string */
- X writechar ((long)67);
- X }
- X writechar ((long)'\n'); /* Print out CR */
- X resetscroll (); /* This has introduced a pause sufficient for any */
- X return (actlen); /* preceding text to have been read */
- X}
- END_OF_FILE
- if test 3067 -ne `wc -c <'input.c'`; then
- echo shar: \"'input.c'\" unpacked with wrong size!
- fi
- # end of 'input.c'
- fi
- if test -f 'makefile' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'makefile'\"
- else
- echo shar: Extracting \"'makefile'\" \(240 characters\)
- sed "s/^X//" >'makefile' <<'END_OF_FILE'
- X.c.o:
- X lc1 -cs -cw -b $*
- X lc2 -v $*
- Xmandelbrot_set: mandelbrot_set.o scanfloat.o saveilbm.o input.o console.o
- X blink from c.o+mandelbrot_set.o+scanfloat.o+saveilbm.o+input.o+console.o to mandelbrot_set lib lcm.lib+lc.lib+amiga.lib nd sc sd
- END_OF_FILE
- if test 240 -ne `wc -c <'makefile'`; then
- echo shar: \"'makefile'\" unpacked with wrong size!
- fi
- # end of 'makefile'
- fi
- if test -f 'mandelbrot0.uu' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'mandelbrot0.uu'\"
- else
- echo shar: Extracting \"'mandelbrot0.uu'\" \(565 characters\)
- sed "s/^X//" >'mandelbrot0.uu' <<'END_OF_FILE'
- Xbegin 644 mandelbrot_set.doc.info
- XMXQ```0``````N0`9`"@`%0`$``,``0##L]``````````````````````````1
- XM````!`@`P>'P`````````+4````.```````````````````````H`!4``@`!A
- XM>Z@#```````````````____,```____/```____/P``X`__/\``____````XU
- XM`____``______``______``_A`#`?``______``Y`(``?``______``X``!`)
- XM?``______``______``___X`?``______``______`````````````````#_3
- XM___\``#````S``#````PP`#````P,`#'_``P#`#````__P#'_````P#``````
- XM`P#``````P#`>_\_@P#``````P#&_W__@P#``````P#'__^_@P#``````P#`8
- XM`````P#```'_@P#``````P#``````P#______P`````````````+.DUO<W0O>
- X%36]S=`#`C
- X``
- Xend
- Xsize 365
- END_OF_FILE
- if test 565 -ne `wc -c <'mandelbrot0.uu'`; then
- echo shar: \"'mandelbrot0.uu'\" unpacked with wrong size!
- fi
- # end of 'mandelbrot0.uu'
- fi
- if test -f 'mandelbrot1.uu' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'mandelbrot1.uu'\"
- else
- echo shar: Extracting \"'mandelbrot1.uu'\" \(1223 characters\)
- sed "s/^X//" >'mandelbrot1.uu' <<'END_OF_FILE'
- Xbegin 644 mandelbrot_set.info
- XMXQ```0``````.0`2`$8`)@`%``,``0#%.[``````````````````````````D
- XM`````_P``````````````#4````'``````````````````````!&`"4``@`"J
- XMKM`#``````````````0````````````"````````````!P```````````!_@-
- XM```````````P<```````````(#```````````#E@```````````/P```````8
- XM```#___`````````'@@&.````````&$``"8```````&````!@``````&````T
- XM`,````/@"`````!@```.'#``````Z```-@<@`````!``%F`1X``````8`%O@T
- XM"\``````&``>@`/```````P``,`&@``````$``!@'*``````(```'_"`````E
- XM`$@`````P``````P`````&`````#8``````R`````,``````#P````<`````#
- XM``/````,````````.0``<`````````?\`\``````````/_T``````````!'`+
- XM```````````@0```````````*,```````````#^````````````.````````5
- XM````"`````````````(````````````$`````````````@````````````<`7
- XM```````````9H```````````+[```````````#_P```````````^X```````E
- XM````#\```````````^?_P````````!WW^?@```````!>___>```````!____U
- XM_X```````______````#X`______X```#_PO_____S@``#G_/______P`!9_R
- XM[Y______^`!;W_7______^@`'O_]O______\``"__O_______```?^S?____@
- XM_]@``!_`______^X`````/______\`````!?_____.``````/?_____`````%
- XM``[____[```````#____^````````"[__Y`````````'^__``````````#_\V
- XM```````````>P```````````/\```````````#?````````````[@```````/
- X<````#@````````````@``````````````````#?`-
- X``
- Xend
- Xsize 838
- END_OF_FILE
- if test 1223 -ne `wc -c <'mandelbrot1.uu'`; then
- echo shar: \"'mandelbrot1.uu'\" unpacked with wrong size!
- fi
- # end of 'mandelbrot1.uu'
- fi
- if test -f 'mandelbrot_.uu' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'mandelbrot_.uu'\"
- else
- echo shar: Extracting \"'mandelbrot_.uu'\" \(19935 characters\)
- sed "s/^X//" >'mandelbrot_.uu' <<'END_OF_FILE'
- Xbegin 644 mandelbrot_set
- XM```#\P`````````"``````````$```Q)```"`0```^D```Q)2.=^_DOO`#0D/
- XM2"0`2?D`````+'@`!"E.`$`I3P!,0JP`2)/)3J[^VB9`*6L`F``X2JL`K&<`)
- XM`'`@#9"M``0&@````(`I0``$80`!>B!K`*S1R-'((F@`$-/)T\D@`G(`$ADI0
- XM20!4T(%2@$)G4H`"0/_^G\!5@$)W"``@`E.`U($?L@``(`!3@E'(__8?O``@(
- XM(`!3@A^Q(``@`%'*__@B3R\)8```;"EK`#H`!`:L````@``$80`!#F$``/@I&
- XM0`!(+P`D0"`J`"1G$BQL!%P@0"(H```I00`X3J[_@B(J`"!G&B0\```#[4ZN\
- XM_^(I0`!09PKEB"!`)V@`"`"D(&P`2"\(2&P``"!H`"0I:``$`%1'^0``!&QR)
- XM`"`\````YF`")L%1R/_\3KHFH'``8`0@+P`$+P`@+``L9P0@0$Z03KHCXBQX5
- XM``0B;`1<3J[^8DJL!&!G"")L!&!.KOYB2JP$9&<((FP$9$ZN_F)*K`!89P@BC
- XM;`!83J[^8DJL`$AG)"(L`#QG!$ZN_]PB+`!09P1.KO_<+'@`!$ZN_WPB;`!(*
- XM3J[^AB`?+FP`3$S??WY.=7!D8(!!ZP!<3J[^@$'K`%Q.KOZ,3G5#[`!<<`!.@
- XMKOW8*4`$7&?:3G4``$Y5__A"ITAL`1Y.NBX44$\I0`!H0J=(;`$P3KHN!%!/'
- XM*4``;'``(&P`;#`H`-@I0`1L.4``JCE``(I(;`"$3KHNM%A/*4``U$J`9@YA1
- XM``C,2'@``TZZ(3I83REL`-0`PDAL`*1.NBZB6$\I0`#82H!F#F$`"*9(>``$U
- XM3KHA%%A/(&P`V"EH`#($HB!L`-30_``L*4@$IF$`!LIA``<X80`(2$AL!;PO*
- XM+`#83KHN<%!/0J<O+`2B3KHM@%!/(&P`V"\H`%9.NBS"6$\@;`#8+R@`5DZZ.
- XM+(Q83RE`!*I*@&?<($`K:``4__P[:``8__HO`$ZZ+()83PRM```!`/_\9LHR<
- XM+?_Z#$'__V?`ZDD"00`_.T'_^`Q!``5DL.5!3OL0`F```!)@``!H8```<&``1
- XM`'I@``"D+RP`V$ZZ+6I83Q`L`-Q3`&8:0BP`W$*G+RP`U$ZZ+>)03T'L`4(I3
- XM2`5D8!P9?``!`-Q(>``!+RP`U$ZZ+<103T'L`5(I2`5D2&P%O"\L`-A.NBV6T
- XM4$]@`/\^0J=A``#06$]@`/\R2'@``6$``,)83V``_R1*+`#<9PQ"IR\L`-1.'
- XMNBU^4$]A-$HL`-QG`/\(2'@``2\L`-1.NBUF4$]@`/[V+RP`V$ZZ+,A83V$`.
- XM!SA"ITZZ'ZA83V``_MQ(;`%B+RP`U$ZZ$2I03TJ`9@PO+`#43KHLV%A/8%)(8
- XM;`%N3KH4#EA/0BP$<$AX`#)(;`1P3KH.,E!/#$#\&&8&3KH1V&`J3KH1TDALU
- XM!'!(;`#>(&P$HB\H``1.N@C,3^\`#$J`9PHO+`#43KHLA%A/3G5.5?]R2.<W_
- XM`$AL`8`O+`#43KH0L%!/2H!F#B\L`-1.NBQ>6$]@``322JT`"&=X2&P!DDZZ4
- XM$XQ83T(L!'!(>``R2&P$<$ZZ#;!03PQ`_!AF"$ZZ$59@``2B2&P$<$ZZ!I!8'
- XM3TAL`:PK0/^**T'_CDZZ$U!83T(L!'!(>``R2&P$<$ZZ#7103PQ`_!AF"$ZZI
- XM$1I@``1F2&P$<$ZZ!E183RM`_X(K0?^&2&P!QDZZ$Q183T(L!'!(>``R2&P$@
- XM<$ZZ#3A03PQ`_!AF"$ZZ$-Y@``0J2&P$<$ZZ!AA83TAL`>0K0/^J*T'_KDZZQ
- XM$MA83T(L!'!(>``R2&P$<$ZZ#/Q03PQ`_!AF"$ZZ$*)@``/N2&P$<$ZZ!=Q8^
- XM3TAL`@(K0/^B*T'_IDZZ$IQ83T(L!'!(>``R2&P$<$ZZ#,!03PQ`_!AF"$ZZ&
- XM$&9@``.R2&P$<$ZZ!:!83TAL`AXK0/^:*T'_GDZZ$F!83T(L!'!(>``R2&P$5
- XM<$ZZ#(103PQ`_!AF"$ZZ$"I@``-V2&P$<$ZZ!6183RM`_Y(K0?^6)"W_HB8M2
- XM_Z9.NA9N;Q8@+?^:(BW_GB0M_ZHF+?^N3KH66&X.2&P".DZZ$@!83V``_N!.Q
- XMN@_>0J<O+`2B3KHJ`E!/("W_FB(M_YXD+?^J)BW_KDZZ$T8D/$!T``!V`$ZZC
- XM%IPK0/_*("W_DBM!_\XB+?^6)"W_HB8M_Z9.NA,>+T``%"`L!&PO00`83KH<O
- XM+"]``!P@+P`4+T$`("(O`!@D+P`<)B\`($ZZ%E0K;?^B_](K;?^F_]8D+`1L%
- XM4X(J`BM`_\(K0?_&2D5K``*8*VW_JO_:*VW_KO_>?``,1@%`;``"8'X`("W_5
- XMVB(M_]XD+?_2)BW_UBM`__(K0?_V*T+_ZB0M__(K0__N)BW_]DZZ&$8K0/^Z2
- XM("W_ZBM!_[XB+?_N)"W_ZB8M_^Y.NA@J*T#_LBM!_[9*K0`(9@``Y`Q'`?]LD
- XM``&N("W_NB(M_[XD+?^R)BW_MDZZ$C8D/$`0``!V`$ZZ%19L``&*("W_\B(MX
- XM__8D+?_R)BW_]DZZ%]HK0/^Z("W_ZBM!_[XB+?_N)"W_ZB8M_^Y.NA>^*T#_X
- XMLB`M_[HK0?^V(BW_OB0M_[(F+?^V3KH1Z"0M_]HF+?_>3KH1SBM`_^(@+?_JS
- XM*T'_YB(M_^XD+?_R)BW_]DZZ%WHK0/_J*T'_[B0M_^HF+?_N3KH1GBM`_^HK-
- XM0?_N)"W_TB8M_]9.NA&**VW_XO_R*VW_YO_V4D<K0/_J*T'_[F``_R`,1P'_/
- XM;```S"`M_[HB+?^^)"W_LB8M_[9.NA%4)#Q`$```=@!.NA0T;```J"`M__(BK
- XM+?_V)"W_\B8M__9.NA;X*T#_NB`M_^HK0?^^(BW_[B0M_^HF+?_N3KH6W"M`@
- XM_[(@+?^Z*T'_MB(M_[XD+?^R)BW_MDZZ$08D+?^*)BW_CDZZ$.PK0/_B("W_C
- XM\BM!_^8B+?_V)#Q`````=@!.NA:8)"W_ZB8M_^Y.NA:,)"W_@B8M_X9.NA"XQ
- XM*VW_XO_R*VW_YO_V4D<K0/_J*T'_[F``_S`@!TC``H`````?+P`O+`2B3KHG@
- XMDE!/(`9(P"(%2,$O`2\`+RP$HDZZ)V!/[P`,("W_VB(M_]XD+?_*)BW_SDZZ<
- XM$%PK0/_:*T'_WE)&8`#]G"`M_](B+?_6)"W_PB8M_\9.NA`Z*T#_TBM!_]938
- XM16``_69,WP#L3EU.=4Y5__Y(YS``0FW__C(M__X,00`@;%1(P3`M__Y(P-"`\
- XM0>P`WB)(T\!T`#01`H(```\`X(HB2-/`=@`V$0*#````\.B+T<!P`#`0`H``C
- XM```/+P`O`R\"+P$O+`2F3KHFD$_O`!12;?_^8*),WP`,3EU.=4Y5__Y(YSTP%
- XM?@`,1P`%;```T"`'<B+!P4'L!*XB2-/`=``S0@`$(DC3P"8'>`K'Q#-#``8BM
- XM2-/`,WP`D``((DC3P#-$``HB2-/`,WP`4@`,(DC3P'8`(T,`#B)(T\`H!\G\"
- XM`!1%[`58)DK7Q"-+`!(B2-/`(T,`%B)(T\!Z`!-%`!HB2-/`(T,`'")(T\`S^
- XM0@`@T<`@!\'!0^P$T-/`((D@2M'$$(4@2M'$$7P`'P`!($K1Q!%\``$``B!*4
- XMT<0Q0@`$($K1Q#%\``$`!B!*T<0A0P`(U<0E0P`04D=@`/\L0JP%-D'L`5(IQ
- XM2`5D0>P"4BE(!7A![`)D*4@%C$'L`G(I2`6@0>P"?BE(!;1,WPR\3EU.=4*L2
- XM!;QP`#E`!<`Y0`7".7P`507$.7P`"@7&.7P``07(0>P"A"E(!<I![`2N*4@%7
- XMSDYU2JP`V&<*+RP`V$ZZ):983TJL`-1G"B\L`-1.NB6"6$\O+`!L3KHD7%A/S
- XM+RP`:$ZZ)%)83TYU3E7_ZDCG!P!Z`"X%(&T`"!`P<``,```P;08,```Y;QX0P
- XM,'``#```+6<4$#!P``P``"YG"DHP<`!G!%)'8,X@;0`($#!P``P``"UF)GH!0
- XM4D<0,'``#```,&T```.6\2$#!P``P``"YG"'``<@!@``%0$#!P`$H`9@AP"
- XM`'(`8``!0-#'?@`K2``((&T`"!`P<``,```P;0H,```Y;@121V#H+`="K?_R&
- XM0JW_]BM\/_```/_J*WP`````_^Y31TI':U8@;0`($#!P`$B`2,`$@````#!.Z
- XMNA:*)"W_ZB8M_^Y.NA,:)"W_\B8M__9.N@U&*T#_\B`M_^HK0?_V(BW_[B0\]
- XM0"0``'8`3KH2\BM`_^HK0?_N4T=@IBM\/[F9F?_J*WR9F9F9_^X@;0`($#!@:
- XM``P``"YF;B`&(`920"X`(&T`"!`P<``,```P;5@,```Y;E(0,'``2(!(P`2`I
- XM````,$ZZ%?XD+?_J)BW_[DZZ$HXD+?_R)BW_]DZZ#+HK0/_R("W_ZBM!__8B:
- XM+?_N)#Q`)```=@!.NA`.*T#_ZBM!_^Y21V":2D5G#B`M__(B+?_V3KH3^F`*_
- XM("W_\B(M__9.<4S?`.!.74YU3E7_LDCG/`!(>`/N+RT`$$ZZ(5903RM`_[9*>
- XM@&8&<`%@``1L<``@;0`(,!`B`.>!=``T*``"%B@`!7@`&"@`!1M#_\\"@P``_
- XM`/]Z`>>E*T#_V"M`__0K0?_\(@).NAUF*T'_^"M!_]PB!$ZZ'5@&@```$`!"A
- XMIR\`*T'_X"M%_^1.NB$R4$\K0/_*2H!F$"\M_[9.NB#P6$]P`F```_(I;?_*8
- XM!=Q(;`*,80`#[%A/6*P%W$AL`I)A``/>6$](;`*880`#U%A/2'@`%&$`!`18R
- XM3R\M__QA``1&6$\O+?_X80`$/%A/0J=A``0T6$]"IV$`!"Q83R!L!=P0K?_/5
- XM4JP%W'``(&P%W!"`4JP%W"!L!=P0O``!4JP%W"!L!=P0@%*L!=Q"IV$``_98[
- XM3W``(&P%W!"`4JP%W"!L!=P0@%*L!=PO+?_\80`#UEA/+RW_^&$``\Q83TAL-
- XM`IYA``,\6$\@+?_DY8B0K?_D+P!A``-D6$]"K?_P(BW_\+*M_^1L2"`!T(!RW
- XM`"!M``PR,`@`(`'@B.F`(&P%W!"`4JP%W"`!`H````#P(&P%W!"`4JP%W`*!#
- XM````#^F!(&P%W!"!4JP%W%*M__!@KB`M_^3EB)"M_^0(````9PH@;`7<0A!29
- XMK`7<2&P"I&$``K!83R!L!=Q8K`7<0JW_\"M(_\8B+?_PLJW_^&P``=!"K?_LT
- XM<``0+?_/)"W_[+2`9``!M"`"Y8`O0``0("W_]"(M__!.NAN8(FT`""(O`!`@;
- XM<1@(T<!P`"M`_]0K0/_0*TC_PE*M_]0@+?_4L*W_]&TJ(@!$@20M_]#2@E*!%
- XM(&P%W!"!4JP%W"!M_\(B;`7<$K`H`%*L!=Q@``%`(&W_PA(P"``4,`C_L@)G"
- XMN"(`1($D+?_0TH)2@2)L!=P2@5*L!=PB;`7<$K`H`%*L!=PK0/_04JW_U"`M8
- XM_]2PK?_T;3@B+?_0D(%3@"!L!=P0@%*L!=PK0?_H(BW_Z+*M_]1L``#:(&W_S
- XMPB)L!=P2L!@`4JP%W%*M_^A@WB!M_\(B+?_4$#`8`!0P&/^P`F:F4JW_U"`M.
- XM_]2PK?_T;3@B+?_0D(%3@"!L!=P0@%*L!=PK0?_H(BW_Z+*M_]1L``"`(&W_9
- XMPB)L!=P2L!@`4JP%W%*M_^A@WB!M_\(B+?_4$#`8`!0P&/^P`F8`_TP@+?_0P
- XMDH`,@0````)O`/[.5X$@;`7<$(%2K`7<*T#_Z"`M_]15@"0M_^BT@&P6(&W_2
- XMPB)L!=P2L"@`4JP%W%*M_^A@W"`M_]15@"M`_]!@`/Z,0JW_T%*M_^Q@`/Y`[
- XM4JW_\&``_B@@+`7<D*W_Q@@```!G"B!L!=Q"$%*L!=P@+`7<D*W_QEF`*T#_L
- XMNB`L!=R0K?_*48`I;?_&!=PO+?^Z*T#_OF$``+Q83R!M_\I8B"E(!=PO+?^^<
- XM80``J%A/("W_OE"`+P`O+?_*+RW_MDZZ'5I/[P`,(BW_OE"!L(%G"'`#*T#_2
- XM\&`$0JW_\"\M_[9.NATD6$\@+?_@(BW_W$ZZ&58B+?_83KH93@:````!]"\`_
- XM+RW_RDZZ'4903R`M__!,WP`\3EU.=4Y5```@;0`((FP%W!*04JP%W")L!=P2I
- XMJ``!4JP%W")L!=P2J``"4JP%W")L!=P2J``#4JP%W$Y=3G5.50``2.<@`"`M*
- XM``@B`'08Y*D@;`7<$(%2K`7<(@!T$.2I(&P%W!"!4JP%W"(`X(D@;`7<$(%2+
- XMK`7<(&P%W!"`4JP%W$S?``1.74YU3E4``"`M``@B`.")(&P%W!"!4JP%W"!LR
- XM!=P0@%*L!=Q.74YU3E7_^$CG(0!";?_Z3KH&XD)M__P@;0`(,BW__!`P$`!*S
- XM`&<6$#`0``P```IF!A&\`'\0`%)M__Q@VB\M``A.N@:`6$].N@1*.T#__DIM]
- XM__YG\C(M__PT+?_ZM$%L!#M!__HT+?_^#$(#Z&8*.WS\&/_Z8``O__F8``-I.N@.0\
- XM.T#__DIM__YG\@QM`$/__F8B,BW__+)M__IL&$AX`)M.N@0`6$](>`!#3KH#8
- XM]EA/4FW__`QM`$3__F8>2FW__&<82'@`FTZZ`]I83TAX`$1.N@/06$]3;?_\N
- XM#&T`0?_^9BXR+?_\#$$`!V\D46W__'X`#$<`"&P82'@`FTZZ`Z183TAX`$1.E
- XMN@.:6$]21V#B#&T`0O_^9C8P+?_Z2,!?@#(M__Q(P;*`;"10;?_\?@`,1P`(@
- XM;!A(>`";3KH#9EA/2'@`0TZZ`UQ83U)'8.)P`#M`__XR+?_^#$$`'V\`_F0,P
- XM00"`;`#^7"`M``Q3@#(M__I(P;*`;`#^2CXM__J^;?_\;Q(@!TC`(&T`"!&P*
- XM"/]P`%-'8.A2;?_Z(&T`"#`M__I",```,"W__%)M__PR+?_^$8$``-#M__Q3Y
- XMB"`(+P!.N@1\6$\^+?_\OFW_^FP`_?)(>``(3KH"REA/4D=@ZGX`OFW__&P8!
- XM(&T`"!`P<``,``!_9@81O``*<`!21V#B(&T`"#`M__I",```/BW__+YM__ILQ
- XM&$AX`)M.N@*&6$](>`!#3KH"?%A/4D=@XDAX``I.N@)N6$].N@0T,"W_^DS??
- XM`(1.74YU``!.5?_X2.<`('``.4`%XCE`!>`I;0`,`L8I;0`(`LI(;`*L3KH;B
- XMP%A/*4`"[$J`9P``J$*G2&P"\$ZZ%ZY03RE``N1*@&<``))"ITAL`OY.NA>8X
- XM4$\I0`+H2H!G?"\L`N1.NAAB6$\I0`+<2H!G:B\L`NA.NAA06$\I0`+@2H!G#
- XM6"\L`NPO`"\L`MQA``#$3^\`#$J`9D)(;`7L+RP"X&$``/Y03W``(&P"Z!`HH
- XM``\D;`+L(FH`5G(`$BD`#TAX``(O*@`R*T#__"M!__A.NAJ:4$\@+`+L8`9A=
- XM```D<`!,WP0`3EU.=2\L`N!.NAG\6$\O+`+<3KH9MEA/80).=4JL`NQG"B\L_
- XM`NQ.NAJ>6$]*K`+D9PHO+`+D3KH79%A/2JP"Z&<*+RP"Z$ZZ%U183TJL`MQGX
- XM"B\L`MQ.NA>>6$]*K`+@9PHO+`+@3KH7CEA/3G5.5?_\2.<!`"!M``@A;0`0%
- XM`"@A?````(0`)'``+P`O""\`2&P#"DZZ&11/[P`0+@`@;0`((FT`#"-H`!0`S
- XM%"-H`!@`&"`'3-\`@$Y=3G5.50``(&T`"#%\``(`'"%M``P`*'`!(4``)"\(!
- XM3KH9&%A/3EU.=2!L`NPO*`!63KH8;EA/*4`%[DJ`9TX@0"EH`!0%Y'(`,B@`_
- XM&"E!!>@O`$ZZ&&!83R(L!>0,@0```@!F!C`\`^A@4`R!```!`&8:(BP%Z`R!4
- XM``#__V<.ZH$"@0```#]P_Y"!8"XO+`+H3KH8#EA/2H!G'G``$"P%["E`!>A(2
- XM;`7L+RP"X&$`_U103R`L!>A@`G``3G5.50``2.<@`"!L`MPQ?``#`!Q![0`+<
- XM(FP"W"-(`"AP`2-``"0O+`+<3KH8/EA/$"T`"PP```IF$G(`.4$%XC(L!>`D%
- XM`5)".4(%X`P```IG"C`L!>)20#E`!>(P+`7@2,#G@`:`````)R!L`NPR*``*L
- XM2,&P@6\H2&P#&F$J6$]A`/[L#$```6WV80#^X@Q``^AG[$)L!>!(;`,B80I8)
- XM3TS?``1.74YU3E7__DCG(`!";?_^(&T`"#(M__X0,!``2@!G%@P``"!G$!`PR
- XM$``,```*9P92;?_^8-HP+`7B2,`R+?_^2,'0@>>`!H`````:(&P"[#(H``A(U
- XMP;"!;Q!*;`7B9PI(>``*80#^^%A/(&P"W#%\``,`'"!L`MPA;0`(`"@P+?_^_
- XM2,`@;`+<(4``)"\(3KH7-EA/,"P%XC(M__[003E`!>(@;0`($#`0``P```IF;
- XM"DAX``IA`/ZH6$\@;0`(,BW__A`P$``,```@9@I(>``@80#^C%A/(&T`"#(M%
- XM__X0,!``2@!G#$C!4H'3K0`(8`#_'$S?``1.74YU3E4``"!L`MPQ?``#`!P@_
- XM;`+<(6T`"``H</\@;`+<(4``)"\L`MQ.NA:D6$].74YU0FP%X$YU``!.50``O
- XM*6T`"``<2JP`(&<4,'P``2)L`""SR&<(2'@`"$Z16$].74YU````,```!2+_B
- XM___^2.<_0&$``!I,WP+\3G5(YS]`80``"$S?`OQ.=0A"`!](0$A"/#R``#X\!
- XM?_`X`,A&N4`Z`,I'NT#,0KU"SD*_0KI'9@``[`Q%?_!F```NL$)M```2+@".F
- XM@68```XN`HZ#9P``#"`"(@-.^0``(DZ\1&<``(1.^0``(BY*168``$9(0&8`2
- XM`"I*@68``"1(0F8``!!*@V8```K(1D[Y```AX"`"(@-(0+U`OT!(0$YU2$)F8
- XM```>2H-F```82$"Y0+M`2$!.=7X0FD>_0+]"2$!(0KQ$9P``*)*#9@``"I&"8
- XM9@``!DYUD8)J```(1(%`@#@&3OD``"#@3OD``"(@TH/1@@R``"```&T``!3B^
- XMB.*1?@#3A]&'!D4`$`Q%?^!E```(3OD``"(*2$#018!$2$!.=6X```K%0,=!'
- XMS43/10Q%?_!G```P2D=F``!"2$)F```02H-F```*N4"[0$A`3G76@]6"2D5F6
- XM```J2$#2@=&`8```)DJ`9@``#DJ!9@``"$[Y```B($[Y```B3@I"`!!(0@I`#
- XM`!!(0)Y%1D?H1P1%`"`,1P`T;@``'M*!T8`,1P`@;P``("8"=``$1P`@[JMTM
- XM`&```#0&10`02$#018!$2$!.=0Q'`!!O```.-@)(0T)"2$($1P`0(D8L`NZJ5
- XM[K[NJ[6&O8,L";Q$9@``/M*#T8(&10`0XHCBD0R``"```&T```H&10`0XHCB#
- XMD7X`TX?1ATA`T$4,17_P9```"(!$2$!.=4[Y```B"I^'DX.1@@R``"```&T`T
- XM_JI$A]*'?@#1A^*(XI$&10`02$#018!$2$!.=0``#(`"````;0``$.*(XI%*X
- XM16P``$Y@```*!$4`$&P``$)$1>A-6$4,10`Y;P``$$[Y```AZC(`0D!(0$A!K
- XM!$4`$&[R!D4`$"0`ZJCJNNJIL8*U@70`TX+1@DA`N4!(0$YU)`#HB.B:Z(FQ*
- XM@K6!=`#3@M&"2$#010Q`?_!E!D[Y```B"KE`2$!.=4J`:P``.$J":@``($J`;
- XM9@``:$J!9@``8DJ#9@``7`R"@````&8``%).=;""9@``#+:!90``1&8``#A.I
- XM=4J":P``'F8``"Q*@V8``"9*@68``"`,@(````!F```63G6T@&8```RR@V4`1
- XM`!!F```$3G5*.0``',A.=4HY```<R4YU_P$``$CG/T!A```(3-\"_$YU/#R`-
- XM`#X\?_!(0$A".`#(1KE`S$*]0KU$L$=M``!ZL$)M```N#(```'_P9@``"$J!G
- XM9P``"$[Y```B3K1';0``(@R"``!_\&8```A*@V<```P@`B(#3OD``").3OD`@
- XM`"(N2H)F```L2H-F```F2.?`P$AY`````TZY```9*%A/3-\#`R`\``!_\+E`>
- XM<@!(0$YU3OD``"(@M$=M```B#((``'_P9@``"$J#9P``#"`"(@-.^0``(DY.'
- XM^0``(>`Z`,I'9@``,$J`9@``($J!9@``&DJ"9@``#DJ#9@``"$[Y```B+D[Y/
- XM```AX$ZY```A>&````B[0`I``!#.0F8``"A*@F8```Q*@V8```9@`/]@Q4#'^
- XM0<]%3KD``"%XQ4#'0<]%8```"+]""D(`$`1'/^":1V@```A.^0``(@I(0"X!`
- XMZ8CIB>F?LT>_0$A"+@-\"^VJ[:OMO[='OT)(1#@%(D1(0H#".`!(03`!0D%(X
- XM0CH"RL1(0SP#S,1(0SX#SL1(1]Y&2$="1DA&W862AY&&9```"%-$TH/1@D)#>
- XM2$0L`$A"@,)H```80D0@!I*#2$*1@DA`2$$P`4)!8```*C@`2$$P`4)!2$(\L
- XM`LS$+@-(1\[$2$?<1TA&0D?=1TA&DH>1AF0``!)31-*#T8)E```(4T32@]&"P
- XM+`!(0H#":```%$)%(`9(0I!"2$!(03`!8```%#H`2$$P`4A"/`+,Q9"&9```Z
- XM#E-%T()E```&4T70@DA%2$*`PF@```1P_SH`(`0B!2@).@1(1$[Y```;P$CG2
- XM/T!A```(3-\"_$YU/#R``#X\?_!(0$A".`#(1KE`S$*]0KU$L$=M``!6L$)MM
- XM```N#(```'_P9@``"$J!9P``"$[Y```B3K1';0``'`R"``!_\&8```A*@V<`K
- XM``P@`B(#3OD``").2H)F```.2H-F```(3OD``"(N3OD``"(@M$=M```T#((`/
- XM`'_P9@``"$J#9P``#"`"(@-.^0``(DY*@&8```Y*@68```A.^0``(BY.^0``P
- XM(B`Z`,I'9@``'DJ`9@``#DJ!9@``"$[Y```AX$ZY```A>&````B[0`I``!#.[
- XM0F8``"I*@F8```Y*@V8```A.^0``(>#%0,=!ST5.N0``(7C%0,=!ST5@```(?
- XMOT(`0@`0!$4_\-I':```"$[Y```B"DA`+@'AB.&)X9^S1[]`2$(N`^&*X8OA%
- XMG[='OT(N`$A'SL,L`DA&S,'>AD)'WT=(1TA!+`',PD)&2$;>ADA#+`/,P$)&C
- XM2$;>ADA`2$(L`,S"QL#>@W8`W8/"PMZ!W8,B`$A!)@)(0\##Q,'1@B0`0D#1N
- XM0$A`2$)"0MZ"T8;"P]*'=`#1@D[Y```;P"\`@Y]G!`A``!].=0R`````(&P`2
- XM`#1(0$A!,`%"001%`0!LZ&```&8%!`,#`@("`@$!`0$!`0$!````````````\
- XM`````````'8`#(```"``;```!N&(4$-(0$I`9@``!NF86$-T`!0[`,#EN-9"B
- XM2$`D`>>IY[JS0K5`Z4N:0VT```Q(0-!%@$1(0$YU1$7H320`ZJCJNNJIL8*U1
- XM@4A`N4!(0$YU2$!(1'H0#(`````@;```%DA`2$$P`4)!!$4!``R`````(&WLM
- XM0D0,@```(`!L```&X8A01$A`2D!F```&Z9A81'P`0_D``"#\'#$``.VXV$9(H
- XM0"P!Z:GIOK-&O4#I3)I$2$!(1$YU``!P`"(`N4!(0$YU2.?`P$AY`````4ZY4
- XM```9*%A/3-\#`W``<@"Y0$A`3G5(Y\#`2'D````"3KD``!DH6$],WP,#(#P`M
- XM`'_PN4!R`$A`3G5(Y\#`2'D````$3KD``!DH6$],WP,#(#Q_\0``<@!.=0@`"
- XM``-G```@2.?`P$AY````!$ZY```9*%A/3-\#`PB```,(P``!`$!_\$A`3G5(T
- XMYSQ`>`!R`&```!I(YSQ`>`!R`$J`9P``.&H```@X/(``1(`,@``@``!D```21
- XM.CQ!($ZY```@X$S?`CQ.=3(`0D!(0$A!.CQ"($ZY```@X$S?`CQ.=0``2.<PY
- XM,BQY````:"!O`!@B;P`<)&\`("9O`"0@+P`H(B\`+"0O`#`F+P`T3J[^I$S?(
- XM3`Q.=4Y5__Q(YR``<``I0``82JT`"&LD)"T`"+2L`\AL&B("YX%![`;$(DC31
- XMP4J19PHB`N>!T<$@"&`(<`DI0`,L<`!,WP`$3EU.=7(`2$!.=4CGP,!(>0``&
- XM``1.N0``&2A83TY5__1(YP`@1>P#-+3\``!G-@@J``(`&V8J""H``0`;9R(@C
- XM*@`$D*H`$"M`__A*@&<2+P`O*@`0+RH`'$ZZ`[)/[P`,)%)@Q"\M``A.N@<><
- XM6$],WP0`3EU.=0``&2A83TS?<&%.5?_V+RT`"$ZZ_S)83RM`__9*@&8$</]@G
- XM*B\M`!`O+0`,(&W_]B\H``1.N@@D3^\`#"M`__I*K``89P1P_V`$("W_^DY=Z
- XM3G5.5?_X("T`"`:`````#"]````@+P``<@`L>``$3J[_.BM`__Q*K?_\9@1P#
- XM`&`T("T`"`:`````#"!M__PA0``(+PA(;`7T80`!"%!/2JP#M&8&*6W__`.TZ
- XM(&W__-#\``P@"$Y=3G5.5?_\+RT`"&&06$\K0/_\2H!F!C!\__\@"$Y=3G5.Z
- XM5?_X2.<!(&$``(!P`"E``!`I0``(*4``#"E``\`I0`/$*4`#N"E``[0I0`.\4
- XM2JP#L&=,("P$:"(L`[#2@%.!(`$B+`1H3KH%$"(L!&A.N@7,4(`N`"`'(`=6H
- XM@.2`Y8`N`"\'80#_%EA/)$"T_```9@1P_V`,+P<O"DZZ`+Q03W``3-\$@$Y=_
- XM3G5.5?_X*VP%]/_\2JW__&<D(&W__"M0__@B;?_\(&W__"`H``@L>``$3J[_D
- XM+BMM__C__D<@I2`7X*4@%]$Y=3G5.50``2.<`(")M``@@:0`$(FT`#"-(I
- XM``21R"*()&T`"$J29@(DB4JJ``1G!B!J``0@B25)``1,WP0`3EU.=0``4W5MQ
- XM``````````````1>.``$7E``!%R@``1>*``$7D1L:%]/<&5N0VYT<&%.5?_\5
- XM("T`#"\`+RT`""M`__QA!E!/3EU.=4Y5_^A(YR$P+BT`#$J';@9P_V```/(,)
- XMAP````AL`GX((`<@!U:`Y(#E@"X`(&T`""M(__31Q]^L`\1#[`/`)%$K2/_P,
- XM*TG_^+3\``!G``"B($H@*@`$($K1P"M(_^PD+?_PM<)C%B)M__0BBB-'``0FG
- XM;?_X)HEP`&```(RUPF8>(E(F;?_T)HD@*@`$(@#2AR=!``0B;?_X(HMP`&!HS
- XM(FW_]+/(9`B?K`/$</]@6+/(9BY*DF<.(A*T@6,(GZP#Q'#_8$+?J@`$2I)G)
- XM$+229@P@0B`H``31J@`$))!P`&`F*TK_^"MM_^S_Z"128`#_6B!M__@@K?_TH
- XMD<@B;?_T(H@C1P`$(`A,WPR$3EU.=4Y5__A(YP$`(&T`#$H89OQ3B)'M``PN^
- XM""!M``A*&&;\4XB1[0`((`@B;0`(T\`K2?_X(BT`$+Z!8P(N`2`'(&T`#&`"3
- XM$MA3@&3Z(&W_^$(P>``@+0`(3-\`@$Y=3G4``$Y5__@O+0`(3KK[IEA/*T#_O
- XM^$J`9@1P_V!((&W_^`@H``,``V<22'@``D*G+RT`"$ZZ_$)/[P`,+RT`$"\M=
- XM``P@;?_X+R@`!$ZZ!"I/[P`,*T#__$JL`!AG!'#_8`0@+?_\3EU.=0``````3
- XM@$YU<&%.5?_P2.<!,"1M``@,K````"`&`&P``)`2$@P!`"!G#`P!``EG!@P!-
- XM``IF!%**8.A*$F=R("P&`.6`4JP&`$'L!@C1P"M(__P,$@`B9BA2BB"*2A)G9
- XM"@P2`")G!%**8/)*$F8,2'@``4ZZ`J)83V"<0A)2BF"6(&W__""*2A)G&!(28
- XM#`$`(&<0#`$`"6<*#`$`"F<$4HI@Y$H29@)@"$(24HI@`/]H2JP&`&8&(&P`D
- XM2&`$0>P&""E(!@1*K`8`9@``AD'L`YPB2$?L!H@FV2;9)MDFV3:1)FP`2")KK
- XM`"1(>``H+RD`!$AL!HA.NOY$3^\`#$'L!H@B""0\```#[BQL!%Q.KO_B*4`&X
- XMR"`L!L@I0`;0<@0I00;,*4`&V"E!!M3E@"M`__"3R2QX``1.KO[:*T#_]"!M@
- XM__`B;?_T(V@`"`"D?@!@,BQL!%Q.KO_**4`&R"QL!%Q.KO_$*4`&T$'L`ZXBB
- XM""0\```#[2QL!%Q.KO_B*4`&V'X$(`<@!P"```"``8&L!L0@!R`'`(```(`",
- XM@:P&S`"L``"``P;42JP#,&<$<`!@!B`\``"``"X`0JP#4"`'(`<`@`````$IU
- XM0`-,<`$I0`-R(`<@!P"``````BE``VYP`BE``Y0@!R`'`(````"`*4`#D$'Z_
- XM`;XI2``P+RP&!"\L!@!.NM@64$]"ITZZ^9Y83TS?#(!.74YU``!F9F9F9F88+
- XM9@````````````````````!*@&H``!Y$@$J!:@``#$2!80``($2!3G5A```8$
- XM1(!$@4YU2H%J```,1(%A```&1(!.=2\"2$$T`68``")(0$A!2$(T`&<```:$W
- XMP3`"2$`T`(3!,`)(0C(")!].=2\#=A`,00"`9```!N&944,,00@`9```!NF9H
- XM64,,02``9```!N6954-*06L```;CF5-#-`#FJ$A"0D+FJDA#@,$V`#`"-`-(J
- XM0<3!D()D```(4T/0@63^<@`R`TA#Y[A(0,-`)A\D'TYU($(B0R0`)@%(0DA#;
- XMQ,'&P,#!U$-(0D)"T((F"20(3G5.5?_X2.<!('X`1>P&Q+ZL`\AL'DJ29Q0(B
- XM*@`"``-G`F`*+RH`!$ZZ`;183U*'4(I@W"\M``PO+0`(3KK6'E!/3-\$@$Y=S
- XM3G5.5?_\<``B/```,``L>``$3J[^S@*````P`"M`__Q*@&8$<`!@)$JL`#!G<
- XM&B!L`#!.D$J`9@1P`&`00J=(>``43KK_=E!/("W__$Y=3G5AL$YU``!*K`!H)
- XM9A)#[`1(<``L>``$3J[]V"E``&@I;`!4!`A(>``\2'@`^G``+P`O`$AL!#1(:
- XM;`0:2&P#_"\`3KKW*$_O`"!3@&<$</]@`G``3G4``$YU`````EI@```!`$Y56
- XM__Q(YP$`2JP`,&<$3KK_0$*L`!@B+0`()"T`#"8M`!`L;`1<3J[_T"X`#(?_C
- XM____9A(L;`1<3J[_?"E``!AP!2E``RP@!TS?`(!.74YU3E7_^$CG,0)*K``P4
- XM9P1.NO[P0JP`&"`M`!!3@"]``!`B+0`()"T`#"8O`!`L;`1<3J[_OBX`#(?_@
- XM____9A(L;`1<3J[_?"E``!AP%BE``RP@+0`0#(`````"9QP,@`````%G"DJ`Y
- XM9B(@+0`,8!P@!R`'T*T`#&`2(BT`"'0`=@`L;`1<3J[_ODYQ3-]`C$Y=3G4`\
- XM`$Y5``!*K``P9P1.NOY@(BT`""QL!%Q.KO_<<`!.74YU(&\`!""(6)!"J``$O
- XM(4@`"$YU``!(YSP@)B\`&!0O`!]Z_R\%3KD``"[H$@!P`!`!*`!R_[*`6(]F#
- XM!'``8&8O/``!``%(>``B3KD``"ZD)$`J"E"/9@XO!$ZY```N_'``6(]@0"5#0
- XM``H50@`)%7P`!``(0BH`#A5$``]"ITZY```NU"5``!!*@UB/9PHO"DZY```OD
- XM$&`*2&H`%$ZY```LT%B/(`I,WP0\3G4O"B1O``A*J@`*9PHO"DZY```O)%B/_
- XM%7P`_P`(</\E0``4<``0*@`/+P!.N0``+OQ(>``B+PI.N0``+KQ/[P`,)%].`
- XM=0``("\`!$AX`#`O`$ZY```MY%"/3G4@+P`$+P!.N0``+B98CTYU2.<X`"0OB
- XM`!`F+P`42H)F!'``8"@O/``!``$O`TZY```NI"!`*`A0CV8"8.01?``%``@Q%
- XM0P`2(4(`#B`(3-\`'$YU(&\`!"`(9@)@)!%\`/\`"'#_(4``%'#_(4``&'``O
- XM,"@`$B\`+PA.N0``+KQ0CTYU``!(YR`"+'D```1<3.\`!@`,3J[_XDS?0`1.@
- XM=0``+PXL>0``!%PB+P`(3J[_W"Q?3G5(YS`"+'D```1<3.\`#@`03J[_T$S?J
- XM0`Q.=0``+PXL>0```$!,[P`#``A.KO\Z+%].=0``+PXL>0```$`B;P`(("\`$
- XM#$ZN_RXL7TYU+PXL>0```$`B;P`(3J[^VBQ?3G4O#BQY````0"`O``A.KOZV)
- XM+%].=2\.+'D```!`("\`"$ZN_K`L7TYU+PXL>0```$`B;P`(3J[^GBQ?3G4O/
- XM#BQY````0")O``A.KOZ8+%].=2\.+'D```!`(&\`"$ZN_HPL7TYU+PXL>0``;
- XM`$`B;P`(3J[^ABQ?3G4O#BQY````0"!O``A.KOZ`+%].=2\.+'D```!`(F\`;
- XM"$ZN_F(L7TYU+PXL>0```$`@;P`(3.\"`0`,(B\`%$ZN_D0L7TYU```O#BQY(
- XM````0")O``A.KOX^+%].=2\.+'D```!`(F\`"$ZN_C@L7TYU+PXL>0```$`B>
- XM;P`(3J[^,BQ?3G4O#BQY````0")O``A.KOX@+%].=2\.+'D```!`(F\`""`O>
- XM``Q.KOW8+%].=2\.+'D```!L(F\`""`O``Q.KO\6+%].=4CG,`(L>0```&P@>
- XM;P`03.\`#P`43J[^X$S?0`Q.=0``+PXL>0```&PB;P`(3.\``P`,3J[^O"Q?C
- XM3G4``"\.+'D```!L(F\`""`O``Q.KOZJ+%].=2\.+'D```!H(&\`"$ZN_\HL)
- XM7TYU+PXL>0```&@@;P`(3J[_OBQ?3G4O#BQY````:"!O``A.KO^X+%].=2\.I
- XM+'D```!H(&\`"$ZN_Z`L7TYU+PXL>0```&@@;P`(3J[_.BQ?3G4O#BQY````3
- XM:"!O``A.KO\T+%].=2\.+'D```!H3.\#```(3J[^^"Q?3G4``"\.+'D```!H6
- XM(&\`""`O``Q.KO[F+%].=0```^P````[````````+@(``"Y.```MS```+=P`X
- XM`"T:```L]@``+4X``"VF```M*@``+6```"UL```MB@``+;(``"+(```BL```&
- XM(F(``"(Z```B%@``(?8``"&\```@T```($8``"`F```?^```(!H``!_R```?I
- XMV```'Z```!_2```?F@``'\```!^(```?:```'R```!X0```=\```'<0``!V^$
- XM```=D@``'6P``!U2```=N```'38``!V,```=,```'1```!S"```<N@``'#X``
- XM`!OP```;D```&GX``!K<```:5```&DX``!GX```9T@``&N(``!G&````(P``4
- XM``$``#$0```P^```,.0``##0```PO```,*@``#"4```P@```,&@``#!,```PZ
- XM+@``,!0``"_\```OZ```+]0``"_````OK```+XP``"]X```O9```+U```"\\@
- XM```O*```+Q0``"\````N[```+M@``"[````NJ```+HX``"YX```N7@``(MH`7
- XM``$2````#@````````/R```#Z@```1L`````````````````````````````?
- XM`````````````````````````````````````````````````````````````
- XM`````````````````````````````````&1O<RYL:6)R87)Y````````````I
- XM36%N9&5L8G)O="!3970@=C$N,@```````4`````%`!\````/`````````'``?
- XM```````````````!0````!\```$````9````````````````````````````Z
- XM````````````#P```````````0````\`#R`/0`]@#X`/H`_`#^`/\`[P#/`*+
- XM\`CP!O`$\`+P`/``X@#$`*8`B`!J`$P`+@`/`0\$#P@/"P\/#PJJ:6YT=6ET^
- XM:6]N+FQI8G)A<GD`9W)A<&AI8W,N;&EB<F%R>0``4VAO=R!4:71L92!"87(`5
- XM`$AI9&4@5&ET;&4@0F%R``!3879E('-C<F5E;@!%;G1E<B!F:6QE;F%M93H*C
- XM``!%;G1E<B!087)A;65T97)S``!%;G1E<B!8(&-O;7!O;F5N="!O9B!#.@H`W
- XM`$5N=&5R(%D@8V]M<&]N96YT(&]F($,Z"@``16YT97(@8F]T=&]M(&QE9G0@D
- XM6"!C;RUO<F0Z"@``16YT97(@8F]T=&]M(&QE9G0@62!C;RUO<F0Z"@``16YT&
- XM97(@=&]P(')I9VAT(%@@8V\M;W)D.@H``$5N=&5R('1O<"!R:6=H="!9(&-O"
- XM+6]R9#H*``!);G9A;&ED(&-O+6]R9&EN871E<R$*``!$;R!-86YD96QB<F]TK
- XM(%-E=`!$;R!*=6QI82!3970``%-A=F4@4V-R965N`$5X:70``$]P=&EO;G,`U
- XM1D]230``24Q"30``0DU(1```0TU!4```0D]$60``````%``4`1@`9``?```#)
- XM````%`H```````````````````````````!X`%@"@`$```\``````````````
- XM`````````````&UY+F-O;BYW<FET90``;7DN8V]N+G)E860`8V]N<V]L92YD0
- XM979I8V4``$U/4D4N+BX`#2`@("`@("`-`````````(`````#5@``````````<
- XM`````````````````````````````````W@`````````````````````````[
- XM`````````````````````````````````````````````````````````````
- XM``!C;VXZ,3`O,3`O,S(P+S@P+P`J````````````````````````````````?
- XM`````"@J*B!5<V5R($%B;W)T(%)E<75E<W1E9"`J*@``__\````.``X`````S
- XM```#S`````#__P````0`!``````````````#Z$-/3E1)3E5%``#__P````0`G
- XM!`````````00`````$%"3U)4`/__````!``$````````!"X`````:6YT=6ETE
- XM:6]N+FQI8G)A<GD```````````````````````0````#[`````<````!```$H
- XA0```!"8```0,```#]````U8```,T````F`````````/R.
- X``
- Xend
- Xsize 14208
- END_OF_FILE
- if test 19935 -ne `wc -c <'mandelbrot_.uu'`; then
- echo shar: \"'mandelbrot_.uu'\" unpacked with wrong size!
- fi
- # end of 'mandelbrot_.uu'
- fi
- if test -f 'saveilbm.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'saveilbm.c'\"
- else
- echo shar: Extracting \"'saveilbm.c'\" \(3407 characters\)
- sed "s/^X//" >'saveilbm.c' <<'END_OF_FILE'
- X
- X#include <libraries/dos.h>
- X#include <graphics/rastport.h>
- X
- X#define putbyte(x) {*d++=(x);}
- X
- Xlong Write ();
- Xunsigned char *AllocMem ();
- Xstruct FileHandle *Open ();
- Xunsigned char *d; /* temp buffer pointer */
- X
- Xint saveilbm (bitmap,colormap,title) /* returns 0 if no error */
- Xstruct BitMap *bitmap;
- Xunsigned short *colormap;
- Xchar *title;
- X{
- X int width,height,rowlen,i,j,k;
- X int numcols,ldepth,lheight,lrowlen;
- X int p,q; /* temp bitmap pointers */
- X unsigned char depth;
- X unsigned char *dest; /* where to put output before writing */
- X unsigned char *e; /* temp buffer pointer */
- X unsigned char *rowstart; /* addr of start of bitplane row */
- X long totlen,bodlen;
- X struct FileInfoBlock *file;
- X if (!(file=Open (title,MODE_NEWFILE)))
- X return (1);
- X rowlen=bitmap->BytesPerRow;
- X width=rowlen*8;
- X height=bitmap->Rows;
- X depth=bitmap->Depth;
- X lrowlen=bitmap->BytesPerRow;
- X lheight=bitmap->Rows;
- X ldepth=bitmap->Depth;
- X numcols=1<<depth;
- X if (!(dest=AllocMem ((long)(lrowlen*lheight*ldepth+4096),0L)))
- X {
- X Close (file); /* we're going to store entire output file in */
- X return (2); /* memory to work on before writing to disk */
- X }
- X d=dest;
- X putword ("FORM");
- X d+=4; /* Leave gap for size which we'll put in later */
- X putword ("ILBM");
- X putword ("BMHD");
- X putlong (20L);
- X
- X /* Write BMHD block */
- X
- X putshort (width);
- X putshort (height);
- X putshort (0);
- X putshort (0);
- X putbyte (depth);
- X putbyte (0);
- X putbyte (1);
- X putbyte (0);
- X putshort (0);
- X putbyte (0);
- X putbyte (0);
- X putshort (width);
- X putshort (height);
- X
- X putword ("CMAP");
- X putlong (numcols*3);
- X
- X /* Write color map */
- X
- X for (i=0;i<numcols;i++)
- X {
- X putbyte ((colormap[i]>>8)<<4);
- X putbyte (colormap[i]&0x00F0);
- X putbyte ((colormap[i]&0x000F)<<4);
- X }
- X if ((numcols*3)&1) /* if odd length, put pad byte */
- X putbyte (0);
- X
- X putword ("BODY");
- X e=d;
- X d+=4; /* leave space to put length in later */
- X
- X /* Write bitplanes */
- X
- X for (i=0;i<height;i++)
- X for (j=0;j<depth;j++)
- X {
- X rowstart=(bitmap->Planes[j])+rowlen*i;
- X p=q=0;
- XL0:
- X if (++p>=rowlen)
- X {
- X putbyte ((char)(-p+q+1));
- X putbyte (rowstart[q]);
- X goto ER;
- X }
- X if (rowstart[p]==rowstart[p-1])
- X goto L0;
- X putbyte ((char)(-p+q+1));
- X putbyte (rowstart[q]);
- X q=p;
- XL1:
- X if (++p>=rowlen)
- X {
- X putbyte ((char)(p-q-1));
- X for (k=q;k<p;k++)
- X putbyte (rowstart[k]);
- X goto ER;
- X }
- X if (rowstart[p]!=rowstart[p-1])
- X goto L1;
- X if (++p>=rowlen)
- X {
- X putbyte ((char)(p-q-1));
- X for (k=q;k<p;k++)
- X putbyte (rowstart[k]);
- X goto ER;
- X }
- X if (rowstart[p]!=rowstart[p-1])
- X goto L1;
- X if (p-q>2)
- X {
- X putbyte ((char)(p-q-3));
- X for (k=q;k<p-2;k++)
- X putbyte (rowstart[k]);
- X q=p-2;
- X }
- X goto L0;
- XER:
- X q=0;
- X }
- X if ((d-e)&1)
- X putbyte (0); /* If body odd length, put pad byte */
- X bodlen=d-e-4;
- X totlen=d-dest-8;
- X d=e;
- X putlong (bodlen);
- X d=dest+4;
- X putlong (totlen);
- X if (Write (file,dest,totlen+8)!=totlen+8)
- X i=3;
- X else
- X i=0;
- X Close (file);
- X FreeMem (dest,(long)(ldepth*lheight*lrowlen+500));
- X return (i); /* No error */
- X}
- X
- Xputword (string)
- Xunsigned char *string;
- X{
- X putbyte (string[0]);
- X putbyte (string[1]);
- X putbyte (string[2]);
- X putbyte (string[3]);
- X}
- X
- Xputlong (n)
- Xunsigned long n;
- X{
- X putbyte ((unsigned char)(n>>24));
- X putbyte ((unsigned char)(n>>16));
- X putbyte ((unsigned char)(n>>8));
- X putbyte ((unsigned char)n);
- X}
- X
- Xputshort (n)
- Xunsigned int n;
- X{
- X putbyte ((unsigned char)(n>>8));
- X putbyte ((unsigned char)n);
- X}
- END_OF_FILE
- if test 3407 -ne `wc -c <'saveilbm.c'`; then
- echo shar: \"'saveilbm.c'\" unpacked with wrong size!
- fi
- # end of 'saveilbm.c'
- fi
- if test -f 'scanfloat.c' -a "${1}" != "-c" ; then
- echo shar: Will not clobber existing file \"'scanfloat.c'\"
- else
- echo shar: Extracting \"'scanfloat.c'\" \(1475 characters\)
- sed "s/^X//" >'scanfloat.c' <<'END_OF_FILE'
- X
- X/* Routine to scan a floating point number from a null-terminated string.
- X * Written 1987 by Russell Wallace. May be freely copied and used in
- X * developing Amiga software. Requires linkage with m.lib if used with
- X * Aztec C. */
- X
- Xtypedef double TYPE; /* Define this as float or double, whichever reqd. */
- X
- XTYPE scanfloat (string)
- Xchar *string;
- X{
- X register short i,j,minus;
- X TYPE number,column;
- X i=minus=0;
- X while ((string[i]<'0' || string[i]>'9')&& string[i]!='-' && string[i]!='.' && string[i])
- X i++; /* Search for start of number or end of string */
- X if (string[i]=='-')
- X {
- X minus=1; /* Is negative number */
- X i++;
- X if ((string[i]<'0' || string[i]>'9')&& string[i]!='.')
- X return ((TYPE)0);
- X }
- X if (string[i]=='\0')
- X return ((TYPE)0); /* If end of string, return 0 */
- X string+=i; /* Move along to start of string */
- X i=0;
- X while (string[i]>='0' && string[i]<='9')
- X i++; /* Look for decimal point */
- X j=i;
- X number=0;
- X column=1;
- X for (i--;i>=0;i--) /* Go back from point to start of number */
- X {
- X number+=(string[i]-'0')*column; /* add digit value to number */
- X column*=10; /* each column is 10 times value of one to right */
- X }
- X column=.1;
- X if (string[j]=='.') /* If decimal point, get stuff after it */
- X for (i=j+1;string[i]>='0' && string[i]<='9';i++)
- X { /* scan right to end of number */
- X number+=(string[i]-'0')*column;
- X column/=10; /* each column 10 times less than one to left */
- X }
- X if (minus)
- X return (-number);
- X else
- X return (number);
- X}
- END_OF_FILE
- if test 1475 -ne `wc -c <'scanfloat.c'`; then
- echo shar: \"'scanfloat.c'\" unpacked with wrong size!
- fi
- # end of 'scanfloat.c'
- fi
- echo shar: End of archive 1 \(of 1\).
- cp /dev/null ark1isdone
- MISSING=""
- for I in 1 ; do
- if test ! -f ark${I}isdone ; then
- MISSING="${MISSING} ${I}"
- fi
- done
- if test "${MISSING}" = "" ; then
- echo You have the archive.
- rm -f ark[1-9]isdone
- else
- echo You still need to unpack the following archives:
- echo " " ${MISSING}
- fi
- ## End of shell archive.
- exit 0
- --
- Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
- Mail comments to the moderator at <amiga-request@uunet.uu.net>.
- Post requests for sources, and general discussion to comp.sys.amiga.misc.
-